#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2021/7/19 18:47
# @Author  : Samge

from PyQt5.QtWidgets import QApplication
import json
import random
import re
import time
import requests
import hashlib


def get_list_subgroup(source_list, step):
    """
    将源列表中数据，顺序地组合（不重复组）成新列表，不足【length】位 或者超过【length】的自适应
    如 length=2，_list=['1', '2', '3', '4', '5', '6'] -> ['12', '34', '56']
    如 length=3，_list=['1', '2', '3', '4', '5', '6'] -> ['123', '456']
    如 length=4，_list=['1', '2', '3', '4', '5', '6'] -> ['1234', '56']
    如 length=5，_list=['1', '2', '3', '4', '5', '6'] -> ['12345', '6']
    如 length=6，_list=['1', '2', '3', '4', '5', '6'] -> ['123456']
    如 length=7，_list=['1', '2', '3', '4', '5', '6'] -> ['123456']

    :source_list :源列表，里面的元素需要是str/int类型
    :step :步长（每组的元素个数）

    :return :返回新列表
    """
    is_value_ok = source_list and step
    if not is_value_ok:
        return source_list

    # 将元素都变为str类型，避免列表中有其他类型导致异常
    source_list = [str(i) for i in source_list]

    source_list_size = len(source_list)
    step = source_list_size if step > source_list_size else step

    new_list = []
    for i in range(source_list_size):
        if i % step == 0:
            new_list.append(''.join(source_list[i:i+step]))
    return new_list


def remove_none_value_elements(input_dict):
    """
    剔除字典中值为None的元素
    """
    if type(input_dict) is not dict:
        return None
    for k in list(input_dict.keys()):
        # dict中值为0的项不进行清除, 只处理为None的值
        if input_dict[k] is None:
            del input_dict[k]
    return dict(input_dict)


def get_full_url(url):
    """判断并返回补全的url"""
    if url is None:
        return None
    if str(url).startswith('http://') or str(url).startswith('https://'):
        return url
    else:
        return 'http://{}'.format(url)


def fix_html_url(response, url_path):
    """修复页面中的href链接"""
    if not url_path or not response:
        return None

    if str(url_path).startswith('javascript'):
        return None

    if url_path.startswith('http'):
        return url_path

    return response.urljoin(url_path)


def is_http_url(url):
    """
    判断是否为http开头的正确格式url
    去除邮箱等
    """
    return url \
           and ';' not in url \
           and 'javascript:' not in url \
           and '@' not in url \
           and re.match('http[s]{0,1}://[^\s]*', url) is not None


def is_file_url(url):
    """
    判断是否为可下载文件格式url
    """
    if url is None:
        return False
    url = url.lower()
    return url.endswith('.pdf') or \
           url.endswith('.ppt') or \
           url.endswith('.pptx') or \
           url.endswith('.xls') or \
           url.endswith('.xlsx') or \
           url.endswith('.doc') or \
           url.endswith('.docx') or \
           url.endswith('.zip') or \
           url.endswith('.rar') or \
           url.endswith('.7z') or \
           url.endswith('.txt') or \
           url.endswith('.ppt') or \
           url.endswith('.tif') or \
           url.endswith('.wps')


def trim_url(url):
    """
    去掉url中的一些特殊字符
    """
    if url is None:
        return None
    return url.replace('%0A', '')


def get_randm_num(mix_num, max_num):
    """从两个数之间取一个随机数"""
    return random.choice([i for i in range(mix_num, max_num + 1)])


def is_lan_ip(_ip):
    """判断是否内网ip"""
    ip_match = '^(127\\.0\\.0\\.1)|(localhost)|(10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(172\\.((1[6-9])|(2\\d)|(3[01]))\\.\\d{1,3}\\.\\d{1,3})|(192\\.168\\.\\d{1,3}\\.\\d{1,3})$'
    return re.match(ip_match, _ip) is not None


def is_contain_chinese(check_str):
    """
    判断字符串中是否包含中文
    :param check_str: {str} 需要检测的字符串
    :return: {bool} 包含返回True， 不包含返回False
    """
    for ch in check_str:
        if u'\u4e00' <= ch <= u'\u9fff':
            return True
    return False


def getMd5(in_str,short_result=False):
    """
    获取字符串的md5
    :param in_str: {str} 输入的字符串
    :return: {str} 输入字符串的md5
    """
    m = hashlib.md5()
    # 检测是否存在中文
    if is_contain_chinese(in_str):
        m.update(in_str.encode("gbk"))
    else:
        m.update(in_str.encode("utf-8"))

    md5 = m.hexdigest()[6:22]
    """
    # in C#
    string res = string.Empty;
    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
    res = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(input)), 3, 8);
    res = res.Replace("-", "").ToLower();
    """
    return md5


def get_qz_md5(in_str):
    """
    使用api接口获取统一的md5。20210417
    :param in_str: {str} 输入的字符串
    :return: {str} 输入字符串的md5
    """
    if not in_str:
        return None
    post_data = {"Input": in_str}
    headers = {'Content-Type': 'application/json'}
    r = requests.post(url="http://192.168.2.202:8828/api/md5",
                             data=json.dumps(post_data, ensure_ascii=False).encode('utf-8'), headers=headers)
    if not r or r.status_code != 200:
        return None
    return eval(r.text).get('data').get('retData')


def get_item_from_list(data_list, index, is_not_none=True):
    """
    获取list中某个下标的值, 如果下标异常，则返回 空字典
    :param data_list: 字典或对象 列表
    :param index: 列表下标
    :param is_not_none: 返回值是否不允许为空，默认true
                     如果取到的对象实际上为空，则默认返回一个空字典，
    """
    is_bad_params = index < 0 \
                    or data_list is None \
                    or len(data_list) <= 0 \
                    or index >= len(data_list)
    if is_bad_params:
        return __get_list_item(None, is_not_none)
    return __get_list_item(data_list[index], is_not_none)


def __get_list_item(obj, is_not_none=True):
    """
    返回一个字典对象
    :param obj: 对象值
    :param is_not_none: 返回值是否不允许为空，默认true
                     如果取到的对象实际上为空，则默认返回一个空字典，
    :return:
    """
    return obj or {} if is_not_none else obj


def copy_text(txt):
    """
    复制内容到剪贴板
    :param txt:
    :return:
    """
    clipboard = QApplication.clipboard()
    clipboard.setText(txt)
